﻿#define _CRT_SECURE_NO_WARNINGS 1
#pragma warning(disable:6031)

#include<stdio.h>
//结构体内存对齐
// 例1:
//struct line
//{
//	char a, c;
//	short b;
//	int s;
//	double d;
//
//};
//int main()
//{
//	struct line LE;
//	printf("%zu\n", sizeof(LE));//16
//	printf("%p %p %p %p %p", &LE.a, &LE.c, &LE.b, &LE.s, &LE.d);
//}
//例2：
//struct T2
//{
//	char a;
//	int c;
//	short b;
//	double d;
//	short f;
//};
//
//printf("%d", sizeof(struct T2));  // 32 
//
//例3：
//struct T3
//{
//	int bno;
//	char name[3];
//	char author[3];
//	float price;
//	int hot;
//	int kc;
//};
//
//printf("%d", sizeof(struct T3));  // 24
//
//例4：
//struct s1
//{
//	int a1;
//	char n1;
//	double b1;
//};
//
//struct QE
//{
//	struct s1 d;
//	// int d.a1;
//	// char d.n1;
//	// double d.b1;
//	int e;
//};
//
//printf("%d", sizeof(struct QE));    // 最大单位 8
//
//例5：
//struct s1
//{
//	char a;
//	int b;
//	short c;
//	int y;
//};
//
//
//struct QE
//{
//	char ch;
//	struct s1 t;
//	char k;
//	double d;
//};
//
//printf("%d", sizeof(struct QE));   // 最大单位  -- 8    32  
//typedef struct book
//{
//	int bno;
//	char name[30];
//	char author[20];
//	float price;
//	int hot;
//	int kc;
//}BK;
//int main()
//{
//	BK arr[5] = {
//{1,"C语言","谭浩强",34.5,2,30},
//{3,"M4","XYD",44.5,3,10},
//{4,"linux系统","xxxx",65.5,4,10},
//{2,"linux驱动","yyyy",90,5,5},
//{6,"硬件","tttt",35.6,3,8}
//	};
//
//	// 热度排行榜，按照热度排行榜输出图书的信息
//	// 数组里面按照热度进行排序  --- 交换整个结构体
//
//	// 冒泡排序
//	int i;  // 轮数 
//	int j;  // 次数
//	BK temp;
//	//轮数=个数-1
//	for (i = 0; i < 5 - 1; i++)
//	{
//		//每轮交换的次数=个数-轮数-1
//		for (j = 0; j < 5 - 1 - i; j++)
//		{
//			//交换
//			if (arr[j].hot < arr[j + 1].hot)
//			{
//				temp = arr[j + 1];
//				arr[j + 1] = arr[j];
//				arr[j] = temp;
//			}
//		}
//	}
//	for (i = 0; i < 5; i++)
//	{
//		printf("%d %-10s %5s %-10.2f %2d %2d\n",arr[i].bno ,arr[i].name ,arr[i].author ,arr[i].price ,arr[i].hot ,arr[i].kc );
//	}
//}






//共用体
//union data
//{
//	char a;
//	short b;
//	int c;
//	char d[20];
//};
//typedef union data DATA;
//int main()
//{
//	DATA Data;
//	printf("%zu\n", sizeof(DATA));
//	printf("%p %p %p %p",&Data.a ,&Data.b,&Data.c , Data.d );
//}
//场景：
//1、接收一个数据它有4个字节，获取它的每一个字节。
//办法1：指针。
//办法2：共用体里面 放1个int和数组char
//typedef union data
//{
//	int a;
//	char str[4];
//}DATA;
//int main()
//{
//	DATA mm;
//	scanf("%x",&mm.a);
//	printf("%x %x %x %x\n",mm.str[0], mm.str[1], mm.str[2], mm.str[3]);
//}
//办法3：共用体里嵌套结构体
//typedef union data
//{
//	int a;
//	struct line
//	{
//		char b[4];
//	}LE;
//}DATA;
//int main()
//{
//	DATA mm;
//	scanf("%x",&mm.a);
//	printf("%x %x %x %x\n",mm.LE.b[3], mm.LE.b[2], mm.LE.b[1], mm.LE.b[0] );//从高位开始分离
//
//}
//位域：
//用共用体嵌套结构体分离出一个数据的每一位。
//union data
//{
//	unsigned char a;
//	struct bit
//	{
//		unsigned char bit0 : 1;
//		unsigned char bit1 : 1;
//		unsigned char bit2 : 1;
//		unsigned char bit3 : 1;
//		unsigned char bit4 : 1;
//		unsigned char bit5 : 1;
//		unsigned char bit6 : 1;
//		unsigned char bit7 : 1;
//	}bits;
//};
//
//
//int main()
//{
//	union data mm;
//
//	/*mm.a = 0xef;*/
//	scanf("%hhu",&mm.a);
//	printf("%d %d %d %d %d %d %d %d\r\n", mm.bits.bit7, mm.bits.bit6, mm.bits.bit5, mm.bits.bit4, mm.bits.bit3, mm.bits.bit2, mm.bits.bit1, mm.bits.bit0);
//
//	return 0;
//}
//int main()
//{
//	enum week { Mon=1, Tues, Wed, Thir, Fir, Sat, Sun };
//	enum week w;
//	printf("请输入一个星期数字：");
//	scanf("%d", &w);
//	switch (w)
//	{
//		case Mon:
//			printf("星期一");
//			break;
//		case Tues:
//			printf("星期二");
//			break; 
//		case Wed:
//			printf("星期三");
//			break;
//		case Thir:
//			printf("星期四");
//			break;
//		case Fir:
//			printf("星期五");
//			break;
//		case Sat:
//			printf("星期六");
//			break;
//		case Sun:
//			printf("星期七");
//			break;
//
//
//	}
//}

//需求：
//TRUE    FALSE
//1       0
//
//新建一种数据类型，bool    有两个值一个是TRUE-- 1  FALSE-- - 0
//typedef enum Bool{ flase,ture }bool;
//// 写一个函数 判断某个数是不是偶数
//isou(int m)
//{
//	if (m % 2 == 0)
//	{
//		return ture;
//	}
//	else
//		return flase;
//}
//int main()
//{
//	int n;
//	printf("请输入一个数：");
//	scanf("%d", &n);
//	bool res = isou(n);
//	if (res == ture)
//	{
//		printf("偶数");
//	}
//	else
//		printf("奇数");
//
//}

//需求2：
//使用枚举写一个程序控制灯开和灯关
//typedef enum control {close,open}CON;
//int main()
//{
//	CON s;
//	scanf("%d",&s);
//	if (s == close)
//	{
//		printf("关灯");
//	}
//	else
//		printf("开灯");
//}
//宏定义
//格式：
//#define 宏名  ---- 做标记

//#define 宏名  (常量  变量  表达式   类型)
//使用PI这个标识符代表圆周率数据
//#define PI 3.14
//int main()
//{
//	printf("%f",PI);
//}
// 使用TT代表变量n
//#define TT n
//int main()
//{
//	int n = 50;
//	printf("%d",TT+5);
//}
// 代表一个表达式
//求数组a的元素个数
//#define SZ sizeof(a)/sizeof(a[0])
//int main()
//{
//	int a[10];
//	printf("%zu", SZ);
//}
//#define 宏名(参数)  (代表的式子等)
//带参宏
//求某个数组的元素个数
//#define Count(SZ) sizeof(SZ)/sizeof(SZ[0])
//int main()
//{
//	int SZ[10];
//	int res = Count(SZ);
//	printf("%d",res);
//}
//类型 给unsigned int 起一个别名u16
//#define u16 unsigned int
//注意事项：
//1、注意宏替换不存在优先级计算问题，警惕 因为优先级问题造成的错误，一般会将宏名后面内容用()包含起来，避免优先级问题。
//
//例：
//定义一个宏代表两个数相加
//#define Add(a,b) a+b
//int main()
//{
//	int a = 5, b = 7;
//	int res = Add(a, b);
//	int resw = 2*Add(a, b);//注意
//
//	printf("%d\n",res);
//	printf("%d", resw);
//
//}
//2、注意typedef和#define在进行类型起别名的区别




//宏定义
//第1种：
//#if 常量
//代码段1
//#endif
//
//如果常量为真代码段会被放入到目标代码里面去，
//如果常量为假代码段不放入到目标代码里面去
//int main()
//{
//	printf("串口配置\r\n"); // 1
//
//#if 1
//	printf("发送数据.....\r\n"); //  2
//#endif
//
//#if 0
//	printf("接收数据.....\r\n");  // 3
//#endif
//
//	printf("公共代码段.......\r\n"); // 4
//
//}
// 
// 
// 第2种：
//#if 常量
//代码段1
//#else
//代码段2
//#endif
//
//如果常量为真代码段1会被放入到目标代码里面去，
//如果常量为假代码段2会被放入到目标代码里面去
//int main()
//{
//	printf("串口配置\r\n"); // 1
//
//#if 0
//	printf("发送数据.....\r\n"); //  2
//#else
//	printf("接收数据.....\r\n");  // 3
//#endif
//
//	printf("公共代码段.......\r\n"); // 4
//
//}
//第3种：
//#ifdef 宏名
//代码段1
//#else	
//代码段2
//#endif
//注意：如果标识符已经被定义过，则程序编译时对代码段1进行编译，否则，对代码段2进行编译
//#define send
//
//int main()
//{
//	printf("串口配置\r\n"); // 1
//
//#ifdef send
//	printf("发送数据.....\r\n"); //  2
//#else
//	printf("接收数据.....\r\n");  // 3
//#endif
//
//	printf("公共代码段.......\r\n"); // 4
//
//}
 
//第4种：
//#ifndef 宏名
//代码段1
//#else	
//代码段2
//#endif
//
//注意：如果标识符已经被定义过，则程序编译时对代码段2进行编译，否则，对代码段1进行编译
//#define recv
//int main()
//{
//	printf("串口配置\r\n"); // 1
//
//#ifndef recv
//	printf("发送数据.....\r\n"); //  2
//#else
//	printf("接收数据.....\r\n");  // 3
//#endif
//
//	printf("公共代码段.......\r\n"); // 4
//
//}
//1、编程需求如下：
//定义一个结构体类型，包含如下成员：
//1.一个指向函数的指针，该函数有一个整型参数并返回一个整型数；
//2.一个整型变量；
//3.一个最多保存20个字符的变量；
//typedef struct data
//{
//	int (*p)(int);
//	int a;
//	char str[20];
//}DATA;
//2、编程需求如下：
//①、设计一个车的结构体，    成员有：型号、    品牌、    颜色、    价格
//②、输入5辆车的信息
//③、输出5辆车的信息
//④、对车辆信息按照价格升序排列
//⑤、输出排序后的车辆信息
//typedef struct car
//{
//	char Model[30],Brand[20],Color[10];
//	float price;
//}CAR;
//int main()
//{
//	int i, j;
//	CAR arr[5] = {
//		{"宝马X3","宝马","red",120000},
//		{"夜马X3","宝马","yellow",130000},
//		{"野马X3","宝马","green",110000},
//		{"飞马X3","宝马","redd",100000},
//		{"黑马X3","宝马","redrr",220000}
//	};
//	printf("型号      品牌    颜色    价格\n");
//	for (i = 0; i < 5; i++)
//	{
//		printf("%-10s %-5s %s    %-10.2f\n",arr[i].Model,arr[i].Brand,arr[i].Color,arr[i].price);
//	}
//	for (i = 0; i < 5 - 1; i++)
//	{
//		for (j = 0; j < 5 - i - 1; j++)
//		{
//			if (arr[j].price < arr[j + 1].price)
//			{
//				CAR temp = arr[j + 1];
//				arr[j + 1] = arr[j];
//				arr[j] = temp;
//			}
//		}
//	}
//	printf("按价格排序后：\n");
//	printf("型号      品牌    颜色    价格\n");
//	for (i = 0; i < 5; i++)
//	{
//		printf("%-10s %-5s %s    %-10.2f\n", arr[i].Model, arr[i].Brand, arr[i].Color, arr[i].price);
//	}
//
//}
//3、编程需求如下：
//①、设计一道选择题的结构体，成员有：题目、选项、答案、分值
//②、设计一张试卷，有5道单项选择题。[结构体数组] -- - 采用初始化给定选择题信息
//③、设计试卷问答环节
//④、给出最后用户的得分情况
//typedef struct choice
//{
//	char question[50], option[50];
//	char answer;
//	int score;
//}ICE;
//int main()
//{
//	int i;
//	ICE arr[5] = {
//		{"你好的英文单词?","A、HI B、hao C、hell D、hehe",'A',3},
//		{"我的英文单词?","A、HI B、I C、hell D、hehe",'B',3},
//		{"你的英文单词？","A、HI B、hao C、YOU D、hehe",'C',3},
//		{"好的英文单词？","A、HI B、hao C、GOOD D、hehe",'C',3},
//		{"问的英文单词？","A、HI B、hao C、hell D、ASK",'D',3}
//	};
//	printf("题目                                                 选项                  分值\n");
//	for (i = 0; i <5; i++)
//	{
//		printf("题目%d:%s%50s%10d\n",i+1,arr[i].question ,arr[i].option  ,arr[i].score );
//	}
//	printf("请输入你的选择：\n");
//	char input;
//	char str[5];
//	int sum=0;
//	i = 0;
//	while (i < 5)
//	{
//		printf("第%d题的答案：", i + 1);
//		scanf("  %c", &input);
//		str[i] = input;
//		if (str[i] == arr[i].answer)
//		{
//			sum += 3;
//		}
//		i++;
//	}
//	printf("总分：%d",sum);
//}

//3、使用枚举设计红绿灯
//用户输入1，打印红灯 - 停
//用户输入2，打印绿灯 - 行
//用户输入3，打印黄灯 - 等一等

//typedef enum trafficlight{red=1,green,yellow}Light;
//int main()
//{
//	Light n;
//	scanf("%d",&n);
//	switch (n)
//	{
//		case red:
//			printf("红灯 - 停");
//			break;
//		case green:
//			printf("绿灯 - 行");
//			break;
//		case yellow:
//			printf("黄灯 - 等一等");
//			break;
//		default:
//			printf("输入错误");
//			break;
//	}
//}

